/* eslint-disable @typescript-eslint/explicit-module-boundary-types */
export default {
  state: () => ({
    count: 1,
  }),
  mutations: {
    // export type Mutation<S> = (state: S, payload?: any) => any;
    // state 局部状态对象
  },
  actions: {
    // export type ActionHandler<S, R> = (this: Store<R>, injectee: ActionContext<S, R>, payload?: any) => any;
    // export interface ActionContext<S, R> {
    //   dispatch: Dispatch;
    //   commit: Commit;
    //   state: S; 局部状态对象
    //   getters: any; 局部 getters
    //   rootState: R; 根状态对象
    //   rootGetters: any; 根 getters
    // }
  },
  getters: {
    // export type Getter<S, R> = (state: S, getters: any, rootState: R, rootGetters: any) => any;
  },
};

// 默认情况下，模块内部的 action、mutation 和 getter 是注册在全局命名空间的——这样使得多个模块能够对同一 mutation 或 action 作出响应。
// 如果希望你的模块具有更高的封装度和复用性，你可以通过添加 namespaced: true 的方式使其成为带命名空间的模块。当模块被注册后，它的所有 getter、action 及 mutation 都会自动根据模块注册的路径调整命名。例如：
// const store = new Vuex.Store({
//   modules: {
//     account: {
//       namespaced: true,
//       // 模块内容（module assets）
//       state: () => ({ ... }), // 模块内的状态已经是嵌套的了，使用 `namespaced` 属性不会对其产生影响
//       getters: {
//         isAdmin () { ... } // -> getters['account/isAdmin']
//       },
//       actions: {
//         login () { ... } // -> dispatch('account/login')
//       },
//       mutations: {
//         login () { ... } // -> commit('account/login')
//       },
//       // 嵌套模块
//       modules: {
//         // 继承父模块的命名空间
//         myPage: {
//           state: () => ({ ... }),
//           getters: {
//             profile () { ... } // -> getters['account/profile']
//           }
//         },
//         // 进一步嵌套命名空间
//         posts: {
//           namespaced: true,
//           state: () => ({ ... }),
//           getters: {
//             popular () { ... } // -> getters['account/posts/popular']
//           }
//         }
//       }
//     }
//   }
// })

// 如果你希望使用全局 state 和 getter，rootState 和 rootGetters 会作为第三和第四参数传入 getter，也会通过 context 对象的属性传入 action。
// 若需要在全局命名空间内分发 action 或提交 mutation，将 { root: true } 作为第三参数传给 dispatch 或 commit 即可。
// modules: {
//   foo: {
//     namespaced: true,
//     getters: {
//       // 在这个模块的 getter 中，`getters` 被局部化了
//       // 你可以使用 getter 的第四个参数来调用 `rootGetters`
//       someGetter (state, getters, rootState, rootGetters) {
//         getters.someOtherGetter // -> 'foo/someOtherGetter'
//         rootGetters.someOtherGetter // -> 'someOtherGetter'
//       },
//       someOtherGetter: state => { ... }
//     },
//     actions: {
//       // 在这个模块中， dispatch 和 commit 也被局部化了
//       // 他们可以接受 `root` 属性以访问根 dispatch 或 commit
//       someAction ({ dispatch, commit, getters, rootGetters }) {
//         getters.someGetter // -> 'foo/someGetter'
//         rootGetters.someGetter // -> 'someGetter'
//         dispatch('someOtherAction') // -> 'foo/someOtherAction'
//         dispatch('someOtherAction', null, { root: true }) // -> 'someOtherAction'
//         commit('someMutation') // -> 'foo/someMutation'
//         commit('someMutation', null, { root: true }) // -> 'someMutation'
//       },
//       someOtherAction (ctx, payload) { ... }
//     }
//   }
// }

// 若需要在带命名空间的模块注册全局 action，你可添加 root: true，并将这个 action 的定义放在函数 handler 中。例如：
// {
//   actions: {
//     someOtherAction ({dispatch}) {
//       dispatch('someAction')
//     }
//   },
//   modules: {
//     foo: {
//       namespaced: true,

//       actions: {
//         someAction: {
//           root: true,
//           namespacedContext 还是局部的 context
//           handler (namespacedContext, payload) { ... } // -> 'someAction'
//         }
//       }
//     }
//   }
// }
